package user

import (
	"fmt"
	"strings"

	"gitee.com/xiaoyutab/xgotool/xerror"
	"gitee.com/xiaoyutab/xgotool/xgodb"
	"gitee.com/xiaoyutab/xgotool/xstring"
)

// 用户密码生成
// 虽然MD5现在以及不再是那么安全，但是此处采用了系统随机码和用户随机掩码的形式保证尽可能的安全
// PS: 主要是因为MD5效率够快、不可逆、生成长度固定等
// PS: 密码生成规则：md5(<后台配置随机串>+<用户随机串>+md5(<用户输入密码>))
// PS: 为了避免后台修改USER_RAND_PASS导致旧用户无法登录问题，此处采取的方案为在用户串中拼接后台随机串，格式为：<后台串>.<用户串>
//
//	pass	明文密码
//	rand	用户掩码
func Passwd(pass, rand string) (string, error) {
	sp := strings.Split(rand, ".")
	if len(sp) == 1 {
		// 如果字符串中不存在.
		sp = []string{xgodb.GetString("USER_RAND_PASS"), rand}
	}
	if xgodb.GetBool("USER_PASS_UP") && !xstring.HasLetterUp(pass) {
		return "", xerror.New("用户密码中需要含有大写字母")
	}
	if xgodb.GetBool("USER_PASS_LOW") && !xstring.HasLetterLower(pass) {
		return "", xerror.New("用户密码中需要含有小写字母")
	}
	if xgodb.GetBool("USER_PASS_NUM") && !xstring.HasNumber(pass) {
		return "", xerror.New("用户密码中需要含有罗马数字")
	}
	if xgodb.GetBool("USER_PASS_CODE") && !xstring.HasPunct(pass) {
		return "", xerror.New("用户密码中需要含有Unicode标点符号")
	}
	return xstring.MD5(fmt.Sprintf("%s_%s_%s",
		sp[0], sp[1], xstring.MD5(pass),
	)), nil
}
